package com.ecommerce.product.service;

import com.ecommerce.product.entity.Product;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.math.BigDecimal;
import java.util.List;

/**
 * 商品服务接口
 * 
 * @author ecommerce-team
 * @version 1.0.0
 */
public interface ProductService {
    
    /**
     * 根据ID查询商品详情
     * 
     * @param id 商品ID
     * @return 商品详情
     */
    Product getProductById(Long id);
    
    /**
     * 分页查询商品列表
     * 
     * @param pageable 分页参数
     * @return 商品分页列表
     */
    Page<Product> getProductList(Pageable pageable);
    
    /**
     * 根据分类ID分页查询商品
     * 
     * @param categoryId 分类ID
     * @param pageable 分页参数
     * @return 商品分页列表
     */
    Page<Product> getProductsByCategory(Long categoryId, Pageable pageable);
    
    /**
     * 根据品牌ID分页查询商品
     * 
     * @param brandId 品牌ID
     * @param pageable 分页参数
     * @return 商品分页列表
     */
    Page<Product> getProductsByBrand(Long brandId, Pageable pageable);
    
    /**
     * 根据价格区间查询商品
     * 
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @param pageable 分页参数
     * @return 商品分页列表
     */
    Page<Product> getProductsByPriceRange(BigDecimal minPrice, BigDecimal maxPrice, Pageable pageable);
    
    /**
     * 根据关键词搜索商品
     * 
     * @param keyword 搜索关键词
     * @param pageable 分页参数
     * @return 商品分页列表
     */
    Page<Product> searchProducts(String keyword, Pageable pageable);
    
    /**
     * 获取推荐商品
     * 
     * @param pageable 分页参数
     * @return 推荐商品分页列表
     */
    Page<Product> getRecommendProducts(Pageable pageable);
    
    /**
     * 获取热销商品
     * 
     * @param pageable 分页参数
     * @return 热销商品分页列表
     */
    Page<Product> getHotProducts(Pageable pageable);
    
    /**
     * 获取新品商品
     * 
     * @param pageable 分页参数
     * @return 新品商品分页列表
     */
    Page<Product> getNewProducts(Pageable pageable);
    
    /**
     * 根据排序方式查询商品
     * 
     * @param sortType 排序类型：sales-销量，price_asc-价格升序，price_desc-价格降序，time-时间
     * @param pageable 分页参数
     * @return 商品分页列表
     */
    Page<Product> getProductsBySort(String sortType, Pageable pageable);
    
    /**
     * 批量查询商品
     * 
     * @param ids 商品ID列表
     * @return 商品列表
     */
    List<Product> getProductsByIds(List<Long> ids);
    
    /**
     * 检查商品库存
     * 
     * @param productId 商品ID
     * @param quantity 需要的数量
     * @return 是否有足够库存
     */
    boolean checkStock(Long productId, Integer quantity);
    
    /**
     * 扣减商品库存
     * 
     * @param productId 商品ID
     * @param quantity 扣减数量
     * @return 是否扣减成功
     */
    boolean reduceStock(Long productId, Integer quantity);
    
    /**
     * 增加商品库存
     * 
     * @param productId 商品ID
     * @param quantity 增加数量
     * @return 是否增加成功
     */
    boolean increaseStock(Long productId, Integer quantity);
    
    /**
     * 增加商品销量
     * 
     * @param productId 商品ID
     * @param quantity 销量增加数量
     * @return 是否增加成功
     */
    boolean increaseSales(Long productId, Integer quantity);
    
    /**
     * 获取商品统计信息
     * 
     * @return 商品总数
     */
    Long getProductCount();
    
    /**
     * 获取分类下商品数量
     * 
     * @param categoryId 分类ID
     * @return 商品数量
     */
    Long getProductCountByCategory(Long categoryId);
    
    /**
     * 查询库存不足的商品
     * 
     * @param threshold 库存阈值
     * @return 库存不足的商品列表
     */
    List<Product> getLowStockProducts(Integer threshold);
}